// 408. [字符串模拟] 简易Linux路径解析
// https://oj.rnd.huawei.com/problems/408/details
//某简易的linux目录系统 cd 命令（change directory）功能如下：
// cd ：进入home目录/home/user；
// cd -：进入上一次停留的目录（连续两个以上 cd -
// 会在两个目录之间来回跳转，而不是回到更早之前的目录 cd <绝对路径>：以 /
// 开头的为绝对路径 cd <相对路径>：不以/开头的为相对路径 现给定一批 cd
//命令，命令格式及相关假设如下： 单独的/表示根目录，且为系统默认的初始目录；
// ////a表示目录/a，即这种格式中的多个 / 等价于一个 / ；
// 特殊目录. ，表示当前层次目录，例如/a/. 表示目录/a；
// 特殊目录..，表示当前层次目录的父目录（根目录的父目录仍为根），例如/a/..表示目录/；
// 假设不会出现第一个命令为cd -的情况；
// 请计算所有命令执行结束后的最终目录，并格式化输出其绝对路径：

//必须以/开头，不以/结尾（除根目录外）；
//不允许特殊目录.、..，不允许连续的/，需转化为所表示的目录；
//解答要求
//时间限制：1000ms, 内存限制：128MB

#include <algorithm>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <vector>
using namespace std;

//#define DEBUG
#ifdef DEBUG
#define PF(...) printf(__VA_ARGS__)
#else
#define PF(...)
#endif

class Solution {
  //  /aa/bb/cc/dd/ee/ff/hh
  //  "/home/user"   结尾
  vector<string> resetPath(const string& path_) {
    string path = path_ + "/";
    PF("reset=%s\n", path.c_str());
    vector<string> vtName;
    for (size_t i = 1; i < path.length();) {
      size_t pos = path.find('/', i);
      //   /aaa/bbb
      string dname = path.substr(i, pos - i);
      PF("reset..[%s]\n", dname.c_str());
      i += (dname.length() + 1);
      if (dname.length() <= 0 || dname == ".") {
        continue;
      }
      if (dname == "..") {
        if (!vtName.empty()) vtName.pop_back();
        continue;
      }
      vtName.push_back(dname);
    }
    return vtName;
  }

  string toPathString(const vector<string>& vtPath) {
    string res = "/";
    for (int i = 0; i < vtPath.size(); i++) res += (vtPath[i] + "/");
    if (res.length() > 1 && res[res.length() - 1] == '/') {
      res = res.substr(0, res.length() - 1);
    }
    return res;
  }

  // removeBar   .   ..
  vector<string> formatPath(const string& path_) {
    vector<string> vtName;
    string path(path_ + "/./");
    string sTmp;
    for (int i = 0; i < path.length(); i++) {
      if (path[i] != '/') {
        sTmp += path[i];
        continue;
      }
      if (sTmp.empty() || sTmp == ".") {
        sTmp.clear();
        continue;
      }
      if (sTmp == "..") {
        if (!vtName.empty()) vtName.pop_back();
        sTmp.clear();
        continue;
      }
      vtName.push_back(sTmp);
      sTmp.clear();
    }
    PF("format=%s\n", toPathString(vtName).c_str());
    return vtName;
  }

 public:
  string GetCurrentDirectory(const vector<string>& cmds) {
    vector<string> lastPath;
    vector<string> nowPath;
    for (auto command : cmds) {
      command = command.substr(2);  // remove cd
      while (command[0] == ' ') command = command.substr(1);
      PF("cd = %s\n", command.c_str());
      vector<string> tmpPath;
      if (command == "") {
        tmpPath = formatPath("/home/user");
      } else if (command[0] == '-') {
        tmpPath = lastPath;
      } else if (command[0] == '/') {
        tmpPath = formatPath(command);
      } else {
        //  ./../aaa/bbb
        tmpPath = formatPath(toPathString(nowPath) + "/" + command);
      }
      PF("cur==========%s\n\n", toPathString(tmpPath).c_str());
      lastPath = nowPath;
      nowPath = tmpPath;
    }
    return toPathString(nowPath);
  }
};

//  last  cd   last

int main() {
  string line;
  getline(cin, line);
  int num = stoi(line);
  vector<string> cmds;
  for (int loop = 0; loop < num; loop++) {
    getline(cin, line);
    cmds.push_back(line);
  }
  Solution parser;
  cout << parser.GetCurrentDirectory(cmds) << endl;
  return 0;
}
